package main

import (
	"context"
	"encoding/json"
	"fmt"
	"kms-backend/utils/logs"

	appsv1 "k8s.io/api/apps/v1"
	// apiCorev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func mainbak() {
	// 1. 初始化config实例
	config, err := clientcmd.BuildConfigFromFlags("", "./config/cls-ik7lvowm-config")
	if err != nil {

		panic((err.Error()))
	}

	// 2. 创建客户端工具，clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	// 3. 操作集群
	// Pods("default") 查询 namespace default 下的pod数量
	// 如果为空，查询所有namespace下pods总数

	// 查询api-resource
	// kubectl api-resources | grep deployment
	// clientset.AppsV1()
	// clientset.NetworkingV1()

	pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		logs.Error(nil, "查询Pods失败")
	} else {
		fmt.Printf("There are %d pods in th cluster\n", len(pods.Items))
	}

	// 查询deployment
	// deployments, _ := clientset.AppsV1().Deployments("saas").List(context.TODO(), metav1.ListOptions{})
	// deploymentsItems := deployments.Items
	// for _, deploy := range deploymentsItems {
	// 	fmt.Printf("当前deployment名称是: %s\n", deploy.Name)
	// }

	// Get方法
	// Get方法中需要传入一个名称参数
	// podDetail, _ := clientset.CoreV1().Pods("default").Get(context.TODO(), "nginx-deployment-77dd77c74d-69gzc", metav1.GetOptions{})
	// // 输出pod中第一个容器镜像的名称
	// fmt.Printf("pod中第一个镜像名称: %s", podDetail.Spec.Containers[0].Image)

	// 获取namespace详情
	// namespaceDetail, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), "saas", metav1.GetOptions{})
	// fmt.Print(namespaceDetail)

	// 更新操作
	// 获取deployment并更新
	// deploymentDetail, _ := clientset.AppsV1().Deployments("default").Get(context.TODO(), "nginx-deployment", metav1.GetOptions{})
	// fmt.Print("该denployment的名称是:", deploymentDetail.Name)

	// 获取当前label
	// labels := deploymentDetail.Labels
	// labels["newlabel"] = "new-label"

	// 修改annotination
	// deploymentDetail.Annotations["new-anno"] = "new-anno"

	// 如果labels 和annotination 原本是空，会报空指针错误，需要提前初始化map

	// 修改副本数量
	// replicas 需要一个指针类型
	// newReplicas := int32(2)
	// deploymentDetail.Spec.Replicas = &newReplicas

	// 修改镜像版本
	// deploymentDetail.Spec.Template.Spec.Containers[0].Image = "nginx:1.22.0"

	// _, err = clientset.AppsV1().Deployments("default").Update(context.TODO(), deploymentDetail, metav1.UpdateOptions{})
	// if err != nil {
	// 	fmt.Print("deployment更新失败: ", err.Error())
	// }

	// 删除资源
	// err = clientset.AppsV1().Deployments("default").Delete(context.TODO(), "nginx-deployment", metav1.DeleteOptions{})
	// if err != nil {
	// 	fmt.Print("删除资源失败: ", err.Error())
	// }

	// 创建资源
	// 创建一个Namespace
	// 声明一个namespace的类型
	// var newNamespace apiCorev1.Namespace
	// newNamespace.Name = "mytest"
	// _, err = clientset.CoreV1().Namespaces().Create(context.TODO(), &newNamespace, metav1.CreateOptions{})
	// if err != nil {
	// 	fmt.Print("创建资源失败: ", err.Error())
	// }

	// 创建一个deployment
	// kubect create deployment nginx --image=nginx --dry-run -oymal
	// 上述命令可以导出一个创建deploymnet必备的参数文档
	// var newDeployment appsv1.Deployment
	// newDeployment.Name = "nginx"
	// newDeployment.Namespace = "mytest"
	// // 初始化一个label，并将其赋值给 selector Matchlabels 和 deployment 本身metadata中的labels
	// label := make(map[string]string)
	// label["app"] = "nginx"
	// label["version"] = "v1"

	// // selector 需要进行初始化
	// newDeployment.Spec.Selector = &metav1.LabelSelector{}

	// newDeployment.Spec.Selector.MatchLabels = label
	// newDeployment.Labels = label

	// // 此处更改pod的标签
	// newDeployment.Spec.Template.Labels = label

	// // 初始化容器列表
	// var newContainers []apiCorev1.Container

	// // 声明一个容器
	// var container apiCorev1.Container
	// container.Image = "nginx"
	// container.Name = "nginx"

	// newContainers = append(newContainers, container)

	// // 再创建一个容器
	// container.Image = "redis"
	// container.Name = "redis"

	// newContainers = append(newContainers, container)

	// newDeployment.Spec.Template.Spec.Containers = newContainers

	// _, err = clientset.AppsV1().Deployments("mytest").Create(context.TODO(), &newDeployment, metav1.CreateOptions{})
	// if err != nil {
	// 	fmt.Print("创建Deployment资源失败: ", err.Error())
	// }

	// 通过json创建资源
	// kubectl create deploy redis --image=redis --dry-run=client -ojson
	deployJson := `{
		"kind": "Deployment",
		"apiVersion": "apps/v1",
		"metadata": {
			"name": "redis",
			"creationTimestamp": null,
			"labels": {
				"app": "redis"
			}
		},
		"spec": {
			"replicas": 1,
			"selector": {
				"matchLabels": {
					"app": "redis"
				}
			},
			"template": {
				"metadata": {
					"creationTimestamp": null,
					"labels": {
						"app": "redis"
					}
				},
				"spec": {
					"containers": [
						{
							"name": "redis",
							"image": "redis",
							"resources": {}
						}
					]
				}
			},
			"strategy": {}
		},
		"status": {}
	}`

	// 声明创建k8s的类型
	var newDeployment2 appsv1.Deployment
	// 把json转换成string
	err = json.Unmarshal([]byte(deployJson), &newDeployment2)
	if err != nil {
		fmt.Print("json转换失败: ", err.Error())
	}
	fmt.Print("json转换struct后配置详情: ", newDeployment2)
	// 创建
	_, err = clientset.AppsV1().Deployments("default").Create(context.TODO(), &newDeployment2, metav1.CreateOptions{})
	if err != nil {
		fmt.Print("创建Deployment资源失败: ", err.Error())
	}

}
